/**
 * AI助教API服务
 * 连接后端ChatAI服务
 */

class AiApiService {
  constructor() {
    // 后端ChatAI服务的基础URL
    this.baseUrl = 'http://localhost:9007/api/ai'
    this.timeout = 30000 // 30秒超时
  }

  /**
   * 生成访客用户ID
   */
  generateGuestUserId() {
    const timestamp = Date.now()
    const random = Math.random().toString(36).substring(2, 15)
    return `web_guest_${timestamp}_${random}`
  }

  /**
   * 发送聊天消息到AI服务
   * @param {String} message 用户消息
   * @param {String} userId 用户ID（可选）
   * @returns {Promise} AI回复的Promise
   */
  async sendMessage(message, userId = null) {
    if (!message || !message.trim()) {
      throw new Error('消息内容不能为空')
    }

    const requestData = {
      message: message.trim(),
      user: userId || this.generateGuestUserId()
    }

    console.log('🤖 [Web AI API] 发送AI消息:', requestData)

    try {
      const response = await this.makeRequest('/chat', 'POST', requestData)
      
      if (response.success && response.content) {
        console.log('✅ [Web AI API] AI回复成功')
        return response.content
      } else {
        throw new Error(response.message || 'AI服务返回异常')
      }
    } catch (error) {
      console.error('❌ [Web AI API] 发送消息失败:', error)
      throw error
    }
  }

  /**
   * 发送流式聊天消息到AI服务
   * @param {String} message 用户消息
   * @param {Function} onChunk 接收到数据块时的回调函数
   * @param {String} userId 用户ID（可选）
   * @returns {Promise} 流式回复的Promise
   */
  async sendMessageStream(message, onChunk, userId = null) {
    if (!message || !message.trim()) {
      throw new Error('消息内容不能为空')
    }

    const requestData = {
      message: message.trim(),
      user: userId || this.generateGuestUserId()
    }

    console.log('🌊 [Web AI API] 发送流式AI消息:', requestData)

    try {
      // 先获取完整回复
      const response = await this.makeRequest('/chat', 'POST', requestData)
      
      if (response.success && response.content) {
        console.log('📝 [Web AI API] 开始流式输出:', response.content.length, '字符')
        
        // 模拟流式输出效果
        await this.simulateStreamOutput(response.content, onChunk)
        
        console.log('🎉 [Web AI] 流式回答完成')
        return response.content
      } else {
        throw new Error(response.message || 'AI服务返回异常')
      }
    } catch (error) {
      console.error('❌ [Web AI API] 流式消息发送失败:', error)
      throw new Error(`AI服务连接超时，请检查网络连接`)
    }
  }

  /**
   * 模拟流式输出效果
   * @param {String} fullContent 完整内容
   * @param {Function} onChunk 数据块回调函数
   */
  async simulateStreamOutput(fullContent, onChunk) {
    let currentContent = ''
    const chars = fullContent.split('')
    
    for (let i = 0; i < chars.length; i++) {
      currentContent += chars[i]
      
      // 每次添加1-3个字符，创建自然的打字效果
      const batchSize = Math.floor(Math.random() * 3) + 1
      if (i % batchSize === 0 || i === chars.length - 1) {
        const isComplete = i === chars.length - 1
        onChunk(currentContent, isComplete)
        
        // 随机延迟，模拟真实的流式输出
        if (!isComplete) {
          await this.delay(30 + Math.random() * 70) // 30-100ms延迟
        }
      }
    }
  }

  /**
   * 延迟工具函数
   * @param {Number} ms 延迟毫秒数
   */
  delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms))
  }

  /**
   * 检查AI服务健康状态
   * @returns {Promise} 健康状态Promise
   */
  async checkHealth() {
    try {
      const response = await this.makeRequest('/health', 'GET')
      console.log('✅ [Web AI API] 健康检查成功:', response)
      return response.status === 'UP'
    } catch (error) {
      console.warn('⚠️ [Web AI API] 健康检查失败:', error)
      return false
    }
  }

  /**
   * 发送HTTP请求的基础方法
   * @param {String} endpoint API端点
   * @param {String} method HTTP方法
   * @param {Object} data 请求数据
   * @returns {Promise} 响应Promise
   */
  async makeRequest(endpoint, method, data = null) {
    const url = this.baseUrl + endpoint
    
    const options = {
      method: method,
      headers: {
        'Content-Type': 'application/json',
      },
      timeout: this.timeout
    }

    if (data && (method === 'POST' || method === 'PUT')) {
      options.body = JSON.stringify(data)
    }

    console.log(`🌐 [Web AI API] 请求: ${method} ${url}`, data || '')

    try {
      const response = await fetch(url, options)
      
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`)
      }

      const responseData = await response.json()
      console.log('📦 [Web AI API] 响应:', responseData)
      
      return responseData
    } catch (error) {
      if (error.name === 'AbortError') {
        throw new Error('请求超时，请检查网络连接')
      }
      throw new Error(`网络请求失败: ${error.message}`)
    }
  }

  /**
   * 获取错误消息的友好提示
   * @param {Error} error 错误对象
   * @returns {String} 友好的错误消息
   */
  getErrorMessage(error) {
    if (error.message.includes('超时')) {
      return '网络连接超时，请检查网络状态'
    } else if (error.message.includes('网络')) {
      return '网络连接失败，请稍后重试'
    } else if (error.message.includes('服务')) {
      return 'AI服务暂时不可用，请稍后重试'
    } else {
      return '发生未知错误，请联系技术支持'
    }
  }
}

// 创建单例实例
const aiApiService = new AiApiService()

export default aiApiService
export { AiApiService }
